﻿// Fence Repair POJ - 3253.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3253
/*
农场主约翰想修理围绕牧场的一小段栅栏。他测量了栅栏的长度，并发现他需要N（1 ≤ N ≤ 20,000）块木板，
每块木板的长度为Li（1 ≤ Li ≤ 50,000）个单位。然后，他购买了一块足够长的木板，可以切割成N块木板（即其长度等于各个木板的长度之和）。
约翰忽略了锯切时产生的锯末损失的长度，你也应该忽略它。

约翰不幸地意识到他没有锯子来切木头，所以他去了唐农场，客气地问能否借一把锯子。

唐农场，一个隐藏的资本家，不借给约翰锯子，而是提议对每一块木板的切割收费。切割一块木板的费用正好等于其长度。21个单位长度的板材切割费用为21美分。

然后唐农场让约翰决定切割木板的顺序和位置。帮助约翰确定他最少需要花费多少钱来制作N块木板。
约翰知道他可以按不同的顺序切割木板，从而得到不同的费用，因为中间产生的木板长度不同。

输入
第1行：一个整数N，表示木板的数量
第2行到第N+1行：每行包含一个整数，描述所需木板的长度
输出
第1行：一个整数，约翰必须花费的最少金额来进行N-1次切割

他想将一块长度为21的木板切割成长度为8、5和8的木块。
原始木板的长度为8+5+8=21。第一次切割将花费21，应当用来将木板切割成长度为13和8的两块。第二次切割将花费13，应当用来将长度为13的木块分别切割成长度为8和5的两块。
这样总共会花费21+13=34。如果将21切割成16和5，则第二次切割将花费16，总共花费37（比34多）。

3
8
5
8

34
*/

int n;
vector<int> v;

int main()
{
	cin >> n;
	priority_queue<int,vector<int>,greater<int> > pq;
	for (int i = 0; i < n; i++) {
		int t; cin >> t;
		pq.push(t);
	}
	long long ans = 0;
	while (!pq.empty()) {
		if (pq.size() == 1) {
			break;
		}
		int sum = pq.top(); pq.pop();
		sum += pq.top(); pq.pop();
		ans += sum;
		pq.push(sum);
	}
	 
	cout << ans << endl;
}

 